import { GetDist } from './Apis.js'


// 基础表单参数配置
const FormItemConfig = [
    { Key: 'BasicParam.EquipModel', FormType: '10,20,30', FormInto: 'BasicParam', Label: '装备名称', FormItemType: 'Input', },
    { Key: 'BasicParam.Distance', FormType: '10,20,30', FormInto: 'BasicParam', Label: '最大作用距离', FormItemType: 'InputNumber', Unit: 'km' },
    { Key: 'BasicParam.Distance2', FormType: '30', FormInto: 'BasicParam', Label: '最大作用距离', FormItemType: 'InputNumber', Unit: 'km' },
    { Key: 'TranRevList[0].IsER', FormType: '10,20,30', FormInto: 'BasicParam', Label: '收发共用天线', FormItemType: 'Select', Dist: '是否类型' },

    { Key: 'TranRevList[0].TranParam.FreqType', FormType: '10,20,30', FormInto: 'TranParam', Label: '频率类型', FormItemType: 'Select', Dist: '频率类型' },

    { Key: 'TranRevList[0].TranParam.FreqFrom', FormType: '10,20,30', FormInto: 'TranParam', Label: '发射频率起', FormItemType: 'InputNumber', Unit: 'MHz' },
    { Key: 'TranRevList[0].TranParam.FreqTo', FormType: '10,20,30', FormInto: 'TranParam', Label: '发射频率止', FormItemType: 'InputNumber', Unit: 'MHz' },
    { Key: 'TranRevList[0].TranParam.FreqCenter', FormType: '10,20,30', FormInto: 'TranParam', Label: '中心频率', FormItemType: 'InputNumber', Unit: 'MHz' },
    { Key: 'TranRevList[0].TranParam.OccupyBand', FormType: '10,20,30', FormInto: 'TranParam', Label: '占用带宽', FormItemType: 'InputNumber', Unit: 'MHz' },

    { Key: 'TranRevList[0].TranAntData.AntType', FormType: '10,20,30', FormInto: 'TranAntData', Label: '天线类型', FormItemType: 'Select', Dist: '天线类型' },
    { Key: 'TranRevList[0].TranAntData.Pola', FormType: '10,20,30', FormInto: 'TranAntData', Label: '极化方式', FormItemType: 'Select', Dist: '极化方式' },

    { Key: 'TranRevList[0].RevParam.FreqType', FormType: '10,20,30', FormInto: 'RevParam', Label: '频率类型', FormItemType: 'Select', Dist: '频率类型' },

    { Key: 'TranRevList[0].RevParam.FreqFrom', FormType: '10,20,30', FormInto: 'RevParam', Label: '发射频率起', FormItemType: 'InputNumber', Unit: 'MHz' },
    { Key: 'TranRevList[0].RevParam.FreqTo', FormType: '10,20,30', FormInto: 'RevParam', Label: '发射频率止', FormItemType: 'InputNumber', Unit: 'MHz' },
    { Key: 'TranRevList[0].RevParam.FreqCenter', FormType: '10,20,30', FormInto: 'RevParam', Label: '接收中心频率', FormItemType: 'InputNumber', Unit: 'MHz' },
    { Key: 'TranRevList[0].RevParam.BandWidth', FormType: '10,20,30', FormInto: 'RevParam', Label: '接收带宽', FormItemType: 'InputNumber', Unit: 'MHz' },

    { Key: 'TranRevList[0].RevAntData.AntType', FormType: '10,20,30', FormInto: 'RevAntData', Label: '天线类型', FormItemType: 'Select', Dist: '天线类型' },
    { Key: 'TranRevList[0].RevAntData.Pola', FormType: '10,20,30', FormInto: 'RevAntData', Label: '极化方式', FormItemType: 'Select', Dist: '极化方式' },

    { Key: 'TranRevList[0].TranAntData.AntType', FormType: '10,20,30', FormInto: 'CommonAntData', Label: '天线类型', FormItemType: 'Select', Dist: '天线类型' },
    { Key: 'TranRevList[0].TranAntData.Pola', FormType: '10,20,30', FormInto: 'CommonAntData', Label: '极化方式', FormItemType: 'Select', Dist: '极化方式' },
]


// 表单组配置，用基础表单的 FormInto 来配置子项显示的位置
const FormConfig = [
    { Label: '装备信息', Rule: "true", Key: 'BasicParam', children: [] },
    {
        Label: '发射机参数', Rule: "TranRevList[0].TranParam", Key: 'TranParam', children: [], childRule: {
            // 让Key 与 规则 做关联
            'TranRevList[0].TranParam.FreqFrom': 'TranRevList[0].TranParam && TranRevList[0].TranParam.FreqType == 1',
            'TranRevList[0].TranParam.FreqTo': 'TranRevList[0].TranParam && TranRevList[0].TranParam.FreqType == 1',
            'TranRevList[0].TranParam.FreqCenter': 'TranRevList[0].TranParam && TranRevList[0].TranParam.FreqType == 0',
            'TranRevList[0].TranParam.OccupyBand': 'TranRevList[0].TranParam && TranRevList[0].TranParam.FreqType == 0',
        }
    },
    { Label: '发射机天线参数', Rule: "TranRevList[0].IsER == 0 && TranRevList[0].TranAntData", Key: 'TranAntData', children: [] },
    {
        Label: '接收机参数', Rule: "TranRevList[0].RevParam", Key: 'RevParam', children: [], childRule: {
            // 让Key 与 规则 做关联
            'TranRevList[0].RevParam.FreqFrom': 'TranRevList[0].RevParam && TranRevList[0].RevParam.FreqType == 1',
            'TranRevList[0].RevParam.FreqTo': 'TranRevList[0].RevParam && TranRevList[0].RevParam.FreqType == 1',
            'TranRevList[0].RevParam.FreqCenter': 'TranRevList[0].RevParam && TranRevList[0].RevParam.FreqType == 0',
            'TranRevList[0].RevParam.BandWidth': 'TranRevList[0].RevParam && TranRevList[0].RevParam.FreqType == 0',
        }
    },
    { Label: '接收机天线参数', Rule: "TranRevList[0].IsER == 0 && TranRevList[0].RevAntData", Key: 'RevAntData', children: [] },
    { Label: '公共天线参数', Rule: "TranRevList[0].IsER == 1 && TranRevList[0].TranAntData", Key: 'CommonAntData', children: [] },
]


// 将表单字段拼合，组合成一个大的配置列表。
// 这样将 基础表单参数配置 与表单显示参数分割，
// 一部分用来显示UI逻辑，一部分用来显示业务逻辑
const FormMapping = {};
for (let i = 0; i < FormConfig.length; i++) {
    const element = FormConfig[i];
    FormMapping[element.Key] = element;
};

for (let i = 0; i < FormItemConfig.length; i++) {
    const element = FormItemConfig[i];
    if (FormMapping[element.FormInto]) {
        FormMapping[element.FormInto].children.push(element);
    }
};


// 字典项缓存需求。 
// 简单来说，就是加一个字典项存储空间，在空间中有值，则返回，没有值，则获取
const DistCache = {};
const AsyncDistCache = {};


const GetLocalDist = function (DistName) {
    // 如果字典项里有值，则返回字典项值
    if (DistCache[DistName]) {
        return DistCache[DistName]
    } else {
        // 如果字典项缓存没有, 而请求列表有，则返回请求中的 Promise
        if (AsyncDistCache[DistName]) {
            return AsyncDistCache[DistName]
        } else {
            // 如果字典项中没有，而且请求列表中也没有，则创建 请求链接
            AsyncDistCache[DistName] = GetDist(DistName).then(function (res) {
                // 清除请求列表的缓存
                AsyncDistCache[DistName] = undefined;
                // 创建字典项的缓存
                DistCache[DistName] = res;
                // Promise 下一个 then 链接中的参数
                // 由于每一个请求链接的 then 链接的都是这个方法，所
                // 以返回值也是由这个参数决定
                return res
            });
            return AsyncDistCache[DistName]
        };
    }
}

// 执行判断条件的方法
const StringToRule = (string, Object) => {
    var keyArray = [];
    var ValueArray = [];
    for (const key in Object) {
        keyArray.push(key);
        ValueArray.push(Object[key]);
    };
    try {
        return !!new Function(keyArray.join(','), 'return ' + string).apply(null, ValueArray);
    } catch (error) {
        console.error('Rule 字段配置错误', error);
    }
}

// 判断 FormConfig 中 childRule 格式
// 如果没有这个字段，返回 true (没有规则，默认显示)
// 有规则，执行规则显示结果
const GetFormItemRull = (childRule, Key, FormData) => {
    if (childRule === undefined || childRule[Key] === undefined) {
        return true
    } else {
        return childRule[Key] && StringToRule(childRule[Key], FormData)
    }
}

// 判断 表单类型值 是否在 FormItemConfig 的列表中，
// 在返回 true，不在返回 false
const GetFormItemByFormType = (ConfigFormType, ValueFormType) => {
    return ConfigFormType.split(',').includes(ValueFormType.toString())
}

export {
    FormItemConfig,
    FormConfig,
    StringToRule,
    GetLocalDist,
    GetFormItemRull,
    GetFormItemByFormType
};
